Listen队列长度,如backlog => 128,此参数将决定最多同时有多少个等待accept的连接。
我们知道tcp有三次握手的过程,客户端syn=>服务端syn+ack=>客户端ack
,当服务器收到客户端的ack后会将连接放到一个叫做accept queue的队列里面(注1),队列的大小由backlog参数和配置somaxconn
的最小值决定,我们可以通过ss -lt
命令查看最终的accept queue队列大小,swoole的主进程调用accept(注2)从accept queue里面取走。
当accept queue满了之后连接有可能成功(注4),也有可能失败,失败后客户端的表现就是连接被重置(注3)或者连接超时,而服务端会记录失败的记录,可以通过 netstat -s|grep 'times the listen queue of a socket overflowed'
来查看日志。如果出现了上述现象,你就应该调大该值了。
幸运的是swoole与php-fpm/apache等软件不同,并不依赖backlog来解决连接排队的问题。所以基本不会遇到上述现象。
- 注1:linux2.2之后握手过程分为syn queue和accept queue两个队列, syn queue长度由
tcp_max_syn_backlog
决定。 - 注2:高版本内核调用的是accept4,为了节省一次set no block系统调用。
- 注3:客户端收到syn+ack包就认为连接成功了,实际上服务端还处于半连接状态,有可能发送rst包给客户端,客户端的表现就是
Connection reset by peer
。 - 注4:成功是通过tcp的重传机制,相关的配置有
tcp_synack_retries
和tcp_abort_on_overflow
。